<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // 需求: 遍历数组 执行特定的操作
    // 1.forEach 数组的遍历  
    // function myEach(arr, fn) {
    //     for (var i = 0; i < arr.length; i++) {
    //         var item = arr[i];
    //         var index = i;
    //         var array = arr;
    //         fn(item, index, array); //实参，传入三个值
    //     }
    // }
    // var arr = [1, 4, 7, 2];
    // var sum = 0;
    // var x = function (a, b, c) { //形参，接收三个值
    //     document.write(a + "<br>");
    //     sum += a;
    // }
    // myEach(arr, x)
    // document.write(sum);


    // 2.map 数组的映射(迭代   => 根据原数组 生成新数组)
    // function myMap(arr, fn) {
    //     var brr = [];
    //     for (var i = 0; i < arr.length; i++) {
    //         var item = arr[i];
    //         var index = i;
    //         var array = arr;
    //         brr[brr.length] = fn(item, index, array); //实参，传入三个值
    //     }
    //     return brr;
    // }
    // var arr = [1, 4, 7, 2];
    // var re = myMap(arr, function (item, index, array) { //形参，接收三个值
    //     document.write(item + "<br>");
    //     return index + 10;
    // })
    // document.write(re);


    // 3.filter 数组的过滤/筛选 (把满足条件的元素 放到新数组中).
    // function myFilter(arr, fn) {
    //     var brr = [];
    //     for (var i = 0; i < arr.length; i++) {
    //         var item = arr[i];
    //         var index = i;
    //         var array = arr;
    //         var x = fn(item, index, array); //实参，传入三个值
    //         if (x) {
    //             brr.push(arr[index]);
    //         }
    //     }
    //     return brr;
    // }
    // var arr = [2, 8, 4, 6, 5, 7, 9, 3, 1];
    // var result = myFilter(arr, function (item, index, array) {
    //     return item % 2 ==0; 
    // })
    // console.log(result);


    // 4.some 判断数组中是否存在满足条件的元素.
    // function mySome(arr, fn) {
    //     var flag = false;
    //     for (var i = 0; i < arr.length; i++) {
    //         var item = arr[i];
    //         var index = i;
    //         var array = arr;
    //         var x = fn(item, index, array); //实参，传入三个值
    //         if (x) {
    //             flag = true;
    //             break;
    //         }
    //     }
    //     return flag;
    // }
    // var arr = [2, 8, 4, 6, 5, 7, 9, 3, 1];
    // var flag = mySome(arr, function (item, index, array) {
    //     return item % 2 ==0 || item % 7 == 0; 
    // })
    // console.log(flag); 


    // 5.every  判断数组中所有的元素是否都满足满足某个条件.
    // function myEvery(arr, fn) {
    //     var flag = true;
    //     for (var i = 0; i < arr.length; i++) {
    //         var x = fn(arr[i], i, arr); //实参，传入三个值
    //         if (!x) {
    //             flag = false;
    //             break;
    //         }
    //     }
    //     return flag;
    // }
    // var arr = [2, 8, 4, 6];
    // var flag = myEvery(arr, function (item, index, array) {
    //     // return item >= 1;
    //     return item % 2 ==0;
    // })
    // console.log(flag); 

    
    // 6.reduce  遍历数组,每次循环时执行传入的回调函数,并将回调函数的结果保留 作为下一次的prev传入
    // 相当于顺着遍历对数组求和(如果有第二个参数传入，就是数组求和后再加上第二个参数否则就是数组求和)
    function myReduce(arr, fn, sum) {
        if (sum != undefined) { //如果sum有初始值传入，正常运行
            for (var i = 0; i < arr.length; i++) {
                var sum = fn(sum, arr[i], i, arr); //实参，传入四个值
            }
        } else { //如果sum没有初始值传入，默认数组第一个元素为初始值，数组从第二个数开始遍历
            sum = arr[0];
            for (var i = 1; i < arr.length; i++) {
                var sum = fn(sum, arr[i], i, arr); //实参，传入四个值
            }
        }
        return sum;
    }
    var arr = [2, 8, 4, 6, 5, 7, 9, 3, 1];
    var re = myReduce(arr, function (prev, item, index, array) {
        console.log(prev, item);
        return prev + item;
    },6)
    console.log(re);
</script>

</html>